import socket, sys

port = 51423  # 服务器端口
host = 'localhost'  # 服务器地址（本机）

# 创建超大数据：104,857,608 字节（约100MB）的字符串
# 注意：原图片描述为10MB，但实际代码中是100MB
# 这会导致死锁问题（原因见下方分析）
data = 'x' * 104857608

# 创建TCP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))  # 连接服务器

byteswritten = 0  # 已发送字节计数器

# 数据发送循环
while byteswritten < len(data):
    # 计算本次发送的数据范围
    startpos = byteswritten
    endpos = min(byteswritten + 1024, len(data))  # 每次发送1KB
    
    # 发送数据（编码为字节）
    # 注意：send()返回实际发送的字节数
    byteswritten += s.send(data[startpos:endpos].encode('utf-8'))
    
    # 显示发送进度（覆盖式输出）
    sys.stdout.write('Wrote %d bytes\r' % byteswritten)
    sys.stdout.flush()  # 强制刷新输出缓冲区

s.shutdown(1)  # 关闭写方向（通知服务器数据发送完毕）

print('All data sent')  # 打印完成信息

# 接收服务器回显的数据
while True:
    buf = s.recv(1024)  # 每次接收1KB
    if not len(buf):  # 接收空数据表示连接关闭
        break
    sys.stdout.write(buf.decode('utf-8'))  # 打印接收的数据